<?php
declare(strict_types=1);

namespace app\middleware;

use app\common\Code;
use think\facade\Cache;
use Closure;

/**
 * 微信登录验证中间件
 */
class WechatAuth
{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // 获取 session_id
        $sessionId = $request->param('session_id', '');

        // 也可以从 header 中获取
        if (empty($sessionId)) {
            $sessionId = $request->header('session-id', '');
        }

        // 验证 session_id 是否存在
        if (empty($sessionId)) {
            fail([], '缺少session_id参数', Code::TOKEN_NOT_FOUND);
        }

        // 从缓存获取 session 信息
        $session = Cache::get(Code::CACHE_WECHAT_SESSION . $sessionId);

        if (!$session) {
            fail([], '会话已过期，请重新登录', Code::TOKEN_EXPIRE);
        }

        // 验证 session 数据完整性
        if (empty($session['openid']) || empty($session['session_key'])) {
            fail([], '会话数据异常，请重新登录', Code::TOKEN_ERROR);
        }

        // 将 session 信息注入到 request 中，方便控制器使用
        $request->wechatSession = $session;
        $request->wechatOpenid = $session['openid'];
        $request->wechatUnionid = $session['unionid'] ?? '';

        return $next($request);
    }
}
